package writenote.io;

import java.io.*;
import java.nio.charset.StandardCharsets;

/*io流：按照方法划分：输入流、输出流
* 定义了两个抽象类：输入流：java.FileStream.InputStream、输出流：java.FileStream.OutputStream
* 流分为：节点流（低级流），处理流（高级流）：不能单独存在，必须跟其他流相连*/
public class FileStream {
    public static void main(String[] args) throws IOException {
       /*文件流（低级流）
       *java.FileStream.InputStream：字节输入流的超类
       *java.FileStream.OutputStream:字节输出流的超类,定义字节的写出方法 void write(),写出一个字节，
       * 将给定的参数的对应的int值对应的2进制的低八位写出 */
        //文件的写入写出：向文件中写入字节
        /*FileOutputStream fos = new FileOutputStream("fos.dat");
        fos.write(1);
        System.out.println("写出完毕！");
        fos.close();//所有的流使用完毕后关闭
        FileInputStream fis = new FileInputStream("fos.dat");
        int d =fis.read();//读到末尾时为-1
        System.out.println(d);
        System.out.println("写入完毕");
        fis.close();*/
        //1、文件复制：缺点，时间长,一次只读一个字节
        /*FileInputStream fis = new FileInputStream("mn.png");
        FileOutputStream fos = new FileOutputStream("mn_cp.png");
        int d;
        Long start = System.currentTimeMillis();//获取系统时间
        while((d=fis.read())!=-1){
            fos.write(d);
        }
        Long end = System.currentTimeMillis();
        System.out.println("复制完毕，耗时："+(end-start)+"ms");
        fis.close();
        fos.close();*/
        //2、块读写的文件复制
        /*FileInputStream fis = new FileInputStream("mn.png");
        FileOutputStream fos = new FileOutputStream("mn_cp.png");
        byte[]bt = new byte[1024*10];//自定义所读字节数
        int len;
        Long start = System.currentTimeMillis();
        while((len=fis.read())!=-1){
            fos.write(bt,0,len);
        }
        Long end = System.currentTimeMillis();
        System.out.println("复制完毕，耗时："+(end-start)+"ms");
        fis.close();
        fos.close();*/
        /*文本数据
        *文件流创建的两种方式
        * 1、覆盖模式：FileOutputStream(String filename),FileOutputStream(File File),原有的内容会被覆盖
        * 2、追加模式：FileOutputStream(String filename,Boolean append),FileOutputSteam(File File,Boolean append)
        *String提供方法: byte[] getBytes(String charsetName) 将当前字符串转换为一组字节*/
        //覆盖模式
        /*FileOutputStream fos = new FileOutputStream("fos.txt");
        String line = "我吹过你吹过的晚风，这算不算相拥";
        byte[]data = line.getBytes(StandardCharsets.UTF_8);
        fos.write(data);
        line ="还记的你说家是唯一的城堡，随着稻香河流继续奔跑";
        data = line.getBytes(StandardCharsets.UTF_8);
        fos.write(data);
        System.out.println("写出完毕");
        fos.close();*/
        //追加模式
      /*  FileOutputStream fos = new FileOutputStream("fos.txt",true);
        String line ="再靠近一点点，就和你牵手";
        byte[] data =line.getBytes(StandardCharsets.UTF_8);
        fos.write(data);
        line ="你想要的是现在，而不是那遥远的未来";
        data = line.getBytes(StandardCharsets.UTF_8);
        fos.write(data);
        System.out.println("写出完毕");
        fos.close();*/
        /*读文本数据*/
       /* FileInputStream fis = new FileInputStream("fos.txt");
        byte[]data= new byte[1024];
        int len=fis.read(data);
        System.out.println("实际读取了："+len+"字节");
        String line = new String(data,0,len,StandardCharsets.UTF_8);
        System.out.println(line.length());
        System.out.println(line);
        fis.close();*/


    }
}
